透過 API 我們可以與不同的應用程式做資料傳遞、溝通,若是每個人都可以存取那麼這樣會造成風險,例如每個人都可以查詢使用者資料、刪除使用者、編輯使用者,這將會是個災難的事,所以授權
跟驗證
是在設計 API 時需要考量的,那麼我們接下來介紹的 JWT 就是其中一種方式。
JWT 的全名是 JSON Web Token
,是一種基於 JSON 的開放標準(RFC 7519
),它定義了一種簡潔(compact)且自包含(self-contained)的方式,用於在雙方之間安全地將訊息作為 JSON 物件傳輸。而這個訊息是經過數位簽章(Digital Signature),因此可以被驗證及信任。可以使用密碼
(經過 HMAC 演算法) 或用一對公鑰/私鑰
(經過 RSA 或 ECDSA 演算法) 來對 JWT 進行簽章。
其中前兩個元素 header 和 payload 是特定結構的 JSON 物件,第三個部分取決於演算法是用來作簽章還是加密。
每個 JWT 都有一個 header。header內含必要欄位:
alg:對此 JWT 進行簽章和(或)解密的主要演算法。對於未加密的 JWT,此聲明必須設置為 none
。
{
"alg": "none"
}
經過編碼後為:eyJhbGciOiJub25lIn0
設定 Token 種類為 JWT、產生signature要使用的雜湊演算法為 HS256。
{
"alg": "HS256",
"typ": "JWT"
}
Payload 也是一個 JSON,使用者和相關的資訊都可以放置其中。通常會使用 exp 設定 Token 到期的時間
{
"sub": "user id",
"name": "Olivia Chen",
"exp": 1300875455
}
注意⚠️
不要將隱私資訊存放在 Payload 當中,Payload 和 Header 被轉換成 Base64 編碼後,能夠被輕易的轉換回來,因此不應該把如用戶密碼等重要資料存取在 Payload 當中。
簽章(Signature)是將被轉換成 Base64 編碼的 Header、Payload 與自己定義的密鑰,透過在 Header 設定的雜湊演算法方式所產生的。
由於密鑰並非公開,因此伺服器端在拿到 Token 後,能透過解碼,確認資料內容正確,且未被變更,以驗證對方身份。